isf 0.1.0

Parsing, Deserialization and Serialization of the Interactive Shader Format.
Documentation
/*{
	"DESCRIPTION": "Shows where there is motion between frames",
	"CREDIT": "by VIDVOX",
	"ISFVSN": "2",
	"CATEGORIES": [
		"Color Effect", "Utility"
	],
	"INPUTS": [
		{
			"NAME": "inputImage",
			"TYPE": "image"
		},
		{
			"NAME": "motionThreshold",
			"LABEL": "Threshold",
			"TYPE": "float",
			"MAX": 1.0,
			"MIN": 0.0,
			"DEFAULT": 0.1
		},
		{
			"NAME": "motionGain",
			"LABEL": "Gain",
			"TYPE": "float",
			"MAX": 2.0,
			"MIN": 0.0,
			"DEFAULT": 1.0
		},
		{
			"NAME": "motionColor",
			"LABEL": "Motion Color",
			"TYPE": "bool",
			"DEFAULT": 1.0
		},
		{
			"NAME": "displayMode",
			"LABEL": "Display Mode",
			"TYPE": "long",
			"VALUES": [
				0,
				1
			],
			"LABELS": [
				"Motion Only",
				"Motion Overlay"
			],
			"DEFAULT": 1
		}
	],
	"PASSES": [
		{
			"TARGET":"differenceBuffer",
			"FLOAT": true
		},		{
			"TARGET":"lastFrameBuffer",
			"PERSISTENT": true
		},
		{
		
		}
	]
	
}*/


vec4 heatColor(float lum)	{
	vec4 returnMe = vec4(1.0);
	vec4 colors[9];
	//	8 color stages with variable ranges to get this to look right
	//	black, purple, blue, cyan, green, yellow, orange, red, red
	colors[0] = vec4(0.0,0.0,0.0,1.0);
	colors[1] = vec4(0.272,0.0,0.4,1.0);	//	dark deep purple, (RGB: 139, 0, 204)
	colors[2] = vec4(0.0,0.0,1.0,1.0);		//	full blue
	colors[3] = vec4(0.0,1.0,1.0,1.0);		//	cyan
	colors[4] = vec4(0.0,1.0,0.0,1.0);		//	green
	colors[5] = vec4(0.0,1.0,0.0,1.0);		//	green
	colors[6] = vec4(1.0,1.0,0.0,1.0);		//	yellow
	colors[7] = vec4(1.0,0.5,0.0,1.0);		//	orange
	colors[8] = vec4(1.0,0.0,0.0,1.0);		//	red

	int ix = 0;
	float range = 1.0 / 8.0;
	
	//	orange to red
	if (lum > range * 7.0)	{
		ix = 7;
	}
	//	yellow to orange
	else if (lum > range * 6.0)	{
		ix = 6;
	}
	//	green to yellow
	else if (lum > range * 5.0)	{
		ix = 5;
	}
	//	green to green
	else if (lum > range * 4.0)	{
		ix = 4;
	}
	//	cyan to green
	else if (lum > range * 3.0)	{
		ix = 3;
	}
	//	blue to cyan
	else if (lum > range * 2.0)	{
		ix = 2;
	}
	// purple to blue
	else if (lum > range)	{
		ix = 1;
	}
	
	returnMe = colors[ix];

	return returnMe;
}


void main()
{
	vec4		freshPixel = IMG_PIXEL(inputImage,gl_FragCoord.xy);
	vec4		returnMe = freshPixel;
	
	if (PASSINDEX == 0)	{
		vec4		stalePixel = IMG_PIXEL(lastFrameBuffer,gl_FragCoord.xy);
		vec3		rgbChange = abs(freshPixel.rgb - stalePixel.rgb);
		float		totalChange = (rgbChange.r + rgbChange.g + rgbChange.b) / 3.0;
		if (motionColor)
			returnMe = heatColor(totalChange * motionGain);
		else
			returnMe = vec4(totalChange * motionGain);
	}
	else if (PASSINDEX == 1)	{
		
	}
	else	{
		vec4		differencePixel = IMG_PIXEL(differenceBuffer,gl_FragCoord.xy);
		if (displayMode == 0)	{
			returnMe = differencePixel;
		}
		else if (displayMode == 1)	{
			const vec4 	lumacoeff = vec4(0.2126, 0.7152, 0.0722, 0.0);
			float		luma = dot(differencePixel, lumacoeff);
			if (luma > motionThreshold)	{
				returnMe = differencePixel;
			}
		}
	}
	
	gl_FragColor = returnMe;
}